/*
 * @Description: 
 * @Date: 2022-02-17 16:53:08
 * @Author: caikaixuan
 * @LastEditTime: 2022-02-18 16:33:34
 */
const { Sequelize, DataTypes } = require("sequelize");

// 从环境变量中读取数据库配置
const { MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_ADDRESS = "" } = process.env;

const [host, port] = MYSQL_ADDRESS.split(":");

var reconnectOptions = {
  retry_on_reconnect: {
    transactions: true
  },
  max_retries: 999,
  onRetry: function(count) {
    console.log("connection lost, trying to reconnect ("+count+")");
  }
};

const sequelize = new Sequelize("nodejs_demo", MYSQL_USERNAME, MYSQL_PASSWORD, {
  host,
  port,
  dialect: "mysql" /* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */,
  reconnect: reconnectOptions || true
});

// // 定义数据模型
// const Counter = sequelize.define("Counter", {
//   count: {
//     type: DataTypes.INTEGER,
//     allowNull: false,
//     defaultValue: 1,
//   },
// });

// 数据库初始化方法
// async function init() {
//   await Counter.sync({ alter: true });
// }

// 导出初始化方法和模型
// module.exports = {
//   init,
//   Counter,
// };

/**
 * 定义数据模型
 * 
 * @param {any} name 模型名称【数据库表名】
 * @param {any} attributes 数据字段集合
 * @returns 数据模型对象
 */
 function defineModel (name, attributes) {
  var attrs = {};

  for (let key in attributes) {
      let value = attributes[key];
      if (typeof value === 'object' && value['type']) {
          // value.allowNull = value.allowNull || false;
          attrs[key] = value;
      } else {
          attrs[key] = {
              type: value,
              // allowNull: false
          };
      }
  }

  // 附加公共字段
  // attrs.id = {
  //     type: ID_TYPE,
  //     primaryKey: true
  // };
  attrs.create_time = {
      type: Sequelize.DATE,
      // allowNull: true
      get(){
          let time = this.getDataValue('create_time')
          if (time == null)return 0
          return Date.parse(new Date(time))/1000
      }
  };
  attrs.update_time = {
      type: Sequelize.DATE,
      // allowNull: true
      get(){
          let time = this.getDataValue('update_time')
          if (time == null)return 0
          return Date.parse(new Date(time))/1000
      }
  };

  // console.log("定义字段",attrs);
  
   // 调用seq的方法定义模型并返回
  return sequelize.define(name, attrs, {
      tableName: name,
      // timestamps: false, //使用时间映射
      freezeTableName: true,//使用name作为表名 否则会默认在name后面+s
      updatedAt: 'update_time',
      // // 并且希望 deletedA t被称为 destroyTime（请记住启用paranoid以使其工作）
      createdAt: 'create_time',
      // hooks: {
      //     beforeValidate: function (obj) {
      //         // let now = Date.now();
      //         console.log(obj)
      //         console.log("dddddss")
      //         if (obj.isNewRecord) {
      //             // console.log("新纪录",obj);
      //             // obj.create_time = now;
      //             // obj.update_time = now;
      //         } else {
      //             // obj.update_time = now;
      //         }
      //     }
      // }
  });
}

exports.defineModel = defineModel;